<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>原型</title>
</head>
<body>
    <script>
        /*
        原型 prototype
          +定义：每一个函数天生自带一个属性，叫做prototype，是一个对象
          +构造函数也是函数，也会有这个自带的空间prototype
          +既然prototype是一个对象，我们就可以使用对象操作的语法，向里面添加一些内容
          
        对象
          +定义：每一个对象，在你访问他的成员的时候，如果自己没有这个属性
            =>会自动去所属构造函数的prototype上查找
          +自定义构造函数创建的对象也是对象，当你访问某一成员的时候
            =>如果没有，也会自动去所属构造函数的原型上查找
            =>哪一个构造函数创建的对象，这个对象就属于哪一个构造函数
            =>因为构造函数在创建对象的过程，我们起名为 实例化 的过程
              ->创建出来的对象叫做这个构造函数的一个 实例化对象
        */

        function Person(){}
        Person.prototype.sayHi=function(){console.log('我是person原型上的方法')}
        console.log(Person.prototype)

        //创建一个实例化对象
        //因为p1是Person实例化出来的对象
        //p1 就是属于Person这个构造函数的
        //当你访问p1的sayHi成员的时候，p1自己是没有的
        //会自动去Person的原型（prototype）上查找
        var p1 = new Person()
        console.log(p1)
        p1.sayHi()

        //创建第二个实例化对象
        //因为p2也是Person的实例化对象
        //p2没有sayHi成员，也会自动去Person的原型上查找
        var p2=new Person()
        console.log(p2)
        p2.sayHi()

        /*
        p1的sayHi方法和p2的sayHi方法都是使用的Person构造函数的原型上的方法
        我只要想Person的原型上添加一些方法
        所有的Person的每一个实例都可以使用
        并且使用的都是同一个函数，不会出现浪费空间的行为
        */
       console.log(p1.sayHi===p2.sayHi)
    </script>
</body>
</html>